#include <cstdio>
typedef long long ll; 
ll a, b, ans[1000], tem[1000], ansIdx, temIdx;

void copy() {
	for (ll i = 0; i < temIdx; i++) {
		ans[i] = tem[i];
	}
}
ll gcd(ll a, ll b) {
	if (b == 0) return a;
	return gcd(b, a % b);	
}


void dfs(ll limit, ll h, ll a, ll b) {
	if (h == limit - 1) {
		if (b % a == 0 && (ansIdx < 0 || ans[ansIdx] > b / a)) {	
			if (tem[temIdx - 1] == b / a) return; //因为重复了 所以舍弃 
			//代表可以更新最优的答案
			tem[temIdx++] = b / a;
			copy();
			//记录最后一个数的位置 
			ansIdx = temIdx - 1; 
			//回溯
			temIdx--; 
		} 
		//最后一个数了 还不能凑成，必然会超出迭代范围 
		return;
	} 
	//进行范围限制
	ll min = b / a - 1; 
	if (min <= tem[temIdx - 1]) {
		//这样可以让每次的数的分母 都比前面的大 避免重复
		min = tem[temIdx - 1]; 
	}
	ll max = (limit - h) * b  / a;
	for (ll j = min + 1; j <= max; j++) {
		//计算出最小公倍数
		ll g = gcd(j, b);
		ll k = j / g; //倍数
		//计算出减去这个数 1 / j  后新的a,b
		ll nb = b * k; 
		ll na = a * k - b / g;
		if (na < 0) {
			//不符合
			continue; 
		} 
		tem[temIdx++] = j; //记录下这个分母 
		dfs(limit, h + 1, na, nb);	
		//回溯
		temIdx--; 
	}
}

int main() {
	scanf("%lld%lld",&a, &b); // a/b
	for (ll i = 1; i < 10; i++) {
		ansIdx = -1;
		temIdx = 0;
		dfs(i, 0, a, b);
		if (ansIdx > 0) break;
	}
	for (ll i = 0; i <= ansIdx; i++) {
		printf("%lld", ans[i]);
		if (i != ansIdx) printf(" ");
	}
	return 0;
} 